package com.toymall.sso.client.controller;

import com.sun.org.apache.xpath.internal.operations.Mod;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.RestTemplate;
import org.thymeleaf.util.StringUtils;

import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.List;

/**
 * 类说明：
 *      处理请求的控制器
 * @author ChenCheng
 * @ClassName HelloController
 * @create 2022-12-14 15:48
 * @Version 1.0
 */
@Controller
public class HelloController {

    // 访问登陆服务器页面的地址
    @Value("${sso.server.url}")
    String ssoServerUrl;

    /**
     * 方法说明： 无需的登录就可以访问的方法
     * @MethodName
     * @Description
     * @Author chen
     * @EMAIL <a href="2277411582@qq.com"></a>
     * @Date 2022/12/14 15:49
     */
    @ResponseBody
    @GetMapping("/hello")
    public String hello(){
       return "hello";
    }

    /**
     * 方法说明：
     *        1.当浏览器访问这个的时候,我们需要去判断当前用户是否登录
     *        2.如果没有登录,访问登录服务器,去登录,还需要带上我们当前的一个地址,登录完成后我们还要回来
     * @MethodName 当前请求是需要登录之后才能访问的
     * @Description
     * @Author Chen
     * @EMAIL <a href="2277411582@qq.com"></a>
     * @Date 2022/12/14 15:58
     */
    @GetMapping("/boss")
    public String employees(Model model, HttpSession session,
                            // 只要登录成功了,认证中心的服务器就会给我们发一个token,我们有了这个token就证明我们是已经登录过的
                            @RequestParam(value = "token",required = false) String token
    ){
        if(!StringUtils.isEmpty(token)){
            // 如果我们这个token现在不等于空,说明我们是去认证中心登录过的
            // 登录成功之后,我们就应该将这个用户的信息方在session里,我们这个用户信息是认证中心来保存的,所有我们需要带着这个token去认证中心要这个用户的信息
            RestTemplate restTemplate = new RestTemplate();
            // 发送请求,去认证服务器查询用户信息
            ResponseEntity<String> forEntity = restTemplate.getForEntity("http://ssoserver.com:8080/userInfo?token=" + token, String.class);
            String body = forEntity.getBody();
            session.setAttribute("loginUser",body);
        }
        // 1.判断当前用户是否登录
        // 从session中去取这个用户信息
        Object loginUser = session.getAttribute("loginUser");
        if(loginUser == null){
        // 没有登录的时候,跳转到登录服务器去登录,并且把我们当前的地址带上,登陆完成以后,再来访问我们当前这个请求
            // redirect_url=http:/http://client1.com:8081/list
            return "redirect:"+ssoServerUrl+"?redirect_url=http://client2.com:8082/boss";
        }else {
        // 用户是登录的状态
            List<String> list = new ArrayList<>();
            list.add("张三");
            list.add("李四");
            model.addAttribute("emps",list);
            return "list";
        }

    }
}
